# 从multiprocessing模块导入Process类，用于创建进程
from multiprocessing import Process
# 导入os模块，用于获取进程ID
import os
# 导入time模块，用于计时
import time
# 定义一个函数，模拟CPU密集型任务
def cpu_bound_task(name):
    # name参数用于标识不同的进程
    # 打印当前进程的名称和其进程ID，表示任务开始
    print(f"进程 {name}: 进程ID {os.getpid()} 开始执行CPU任务...")

    # 记录任务开始时间
    start_time = time.time()
    # 初始化一个变量用于计算
    count = 0

    # 执行一个CPU密集型循环，计算一个大数，模拟耗时计算
    for i in range(10**6):
        # 计算平方和
        count += i * i

    # 记录任务结束时间
    end_time = time.time()
    # 打印当前进程的名称，表示任务完成，并显示计算结果和耗时
    print(f"进程 {name}: CPU任务完成. 最终计数: {count}. 耗时: {end_time - start_time:.2f}秒")

# 使用 if __name__ == '__main__': 保护主代码，避免在 Windows 上使用 multiprocessing 时出错
if __name__ == '__main__':
    # 打印主进程开始信息
    print("主进程开始.")

    # 创建第一个进程实例，目标函数为cpu_bound_task，并传递参数"Process-1"
    process1 = Process(target=cpu_bound_task, args=("Process-1",))
    print("process1后.")
    # 创建第二个进程实例，目标函数为cpu_bound_task，并传递参数"Process-2"
    process2 = Process(target=cpu_bound_task, args=("Process-2",))
    print("process2后.")

    # start()方法用于启动进程，异步事件，不阻塞执行
    # 启动第一个进程，使其开始执行
    process1.start()
    print("process1.start()后.")
    # 启动第二个进程，使其开始执行
    process2.start()
    print("process2.start()后.")

    # join()方法用于等待进程完成，阻塞当前线程直到被调用的进程终止
    # 等待第一个进程执行完成
    process1.join()
    print("process1.join()后.")
    # 等待第二个进程执行完成
    process2.join()
    print("process2.join()后.")

    # 打印所有进程任务完成信息
    print("所有进程任务完成.")